package ww;

public class J26_TypeCasting {

	// 모든클래스의 조상 
	// 모든 클래스는 자동적으로 java.lang.object를 확장함
	// 즉, object 클래스는 자바에서 궁극의 super 클래스임
	// 기본적으로 Object 클래스에는 7개의 메서드가 정의되어 있고
	// 하위 클래스에서는 이것을 재정의해서 적절히 사용가능
	// equals - 기존 객체와 매개변수로 전달된 객체와 비교 
	//			객체 비교가 제대로 이뤄질려면 메서드를 재정의하고 구현해야함
	// hashcode - 객체의 해시코드를 출력함
	//				객체는 일반적으로 heap에 생성됨
	// 				heap에 생성된 객체의 메모리 주소를
	//				바탕으로 만들어지는 유일한 코드 값을 의미
	// to string - 객체에 대한 설명을 출력함
	// 객체지향에서 중요한 개념 캡슐화,상속,다형성
	
	// 다형성  polymorphism
	// OOP의 중요 개념 중 하나
	// 특정 유형의  프로그래밍 요소(변수)가 상황에 따라 
	// 다양한 유형의 요소로 바뀔수 있는 특성을 의미
	// 주로 상속관계에 있는 클래스간에서
	// 나타나는 특별한 성질
	
	// is-a 관계확인
	// 특정 객체가 어떤 유형과 동일한지 
	// 또는 상속관계인지 알아볼떄에는 
	// instanceof 예약어를 사용
	public static void main(String[] args) {
	
	Object obj = new Object();
	J25_Fish f = new J25_Fish();
	J25_Animal a = new J25_Animal();
	a = new J25_Fish();
	// Fish는 Animal을 확장했기 때문에 
	// Animal 객체에 Fish  객체를 받을 수 있음
	// 하위 객체를 상위 객체로 cast 하는 경우
	// 이것을 upcasting 이라 함
	// f = (J25_Fish)new J25_Animal();
	// 상위 객체를 하위 객체로 cast 하는 경우
	// 이것을 downcasting 이라 함
	// 이떄 명시적으로 괄호안에 cast 할
	// 클래스 자료형을 명시
	
	// 스타크래프트 게임내에서 
	// 해병, 불곰, 의무병을 생산하는 경우
	//TerranUnit - Marine, Firebat, Medic
	/*Marine m1 = new Marine();			
	Firebat f1 = new Firebat();
	Medic d1 = new Medic();*/ 		// 하나의 객체 생성 잘못됨
	// 다형성을 근거로 테란유닛 생산(upcasting)
	// 즉 , Marine 유닛은 상황에 따라 
	// Terranunis 도 될 수 있다는 의미
	Terranunits t1 = new Marine();	// upcasting 마린을 테란으로
	t1.sayUnit();
	t1.sayUnit((Marine)t1);			// downcasting 테란을 마린으로
	Terranunits t2 = new Firebat();
	t2.sayUnit();
	t2.sayUnit((Firebat)t2);
	Terranunits t3 = new Medic(); 		// 상속으로 객체 생성법
	t3.sayUnit();
	t3.sayUnit((Medic)t3);
	Allinanceunit a1 = new Human();
	Allinanceunit a2 = new Wolf();
	Allinanceunit a3 = new Nom();
	
	// 객체유형 확인하기
	J26_TypeCasting t = new J26_TypeCasting();
	if(t1 instanceof java.lang.Object)
		System.out.println("t 는 Object의 자손");
	if(t2 instanceof Terranunits)		// is-a
		System.out.println("해병은 테란유닛의 자손");
	if(t3 instanceof Marine)			// 동질성
		System.out.println("m1 해병임");
	}
	
}
class Terranunits {
	public void sayUnit(){
		System.out.println("나와라 유닛!");
	}
	public void sayUnit(Marine m){
		System.out.println("미네랄이 부족합니다");
	}public void sayUnit(Firebat f){
		System.out.println("가스가 부족합니다");
	}
	public void sayUnit(Medic m){
		System.out.println("인구수가 없습니다");
	}
}
class Marine extends Terranunits{
	
}
class Firebat extends Terranunits{
	
}
class Medic extends Terranunits{
	
}
// ALLianceunit - Human, Wolf, Nom
class Allinanceunit{
	
}
class Human extends Allinanceunit{
	
}
class Wolf extends Allinanceunit{
	
}
class Nom extends Allinanceunit{
	
}
